#include <iostream>
using namespace std;

// 常函数
class Person
{
public:
    int age = 10;
    mutable int money = 20; // 特殊变量，即使在常函数中，也可以修改这个值
    
    // this指针的本质为指针常量  指向不可修改    Person * const this;
    // error: this = NULL;  this指针不可修改

    // 常函数 -- 不能修改成员属性
    void showPerson() const // 相当于const Person * const this;
    {
        // 成员函数后面加const，修饰的是this指针，让this指向的值也不可以修改
        // error:  this->age = 100;   age = 100;

        money = 3500;
    }

    void func(){
        
    }
    
    void func2() const;
};

// 常成员函数被定义在类外 -- const不可省略
void Person::func2() const {
    
}

void test1()
{
    Person p;
    p.showPerson();
}

//常对象
void test2()
{
    const Person p;// 常对象
    
    p.money = 30;// 特殊值，在常对象下也可以修改
    //error:  p.age = 20;

    //p.func();     常对象只能调用常函数
    p.showPerson();
    
    Person p2;
    p2.func();
    p2.showPerson();// 普通对象，即可以调用常函数，也可以调用普通函数
}


int main()
{

    return 0;
}